﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using Tibet.Datos.Interfaces;
using Tibet.Datos;
using Tibet.Entidades;
using System.Data.SqlClient;
using Tibet.Datos.FabricaDatos;

namespace Tibet.Datos.DaosSqlServer
{
    public class DaoSqlServerAccesoPerfilRegla:IDaoAccesoPerfilRegla
    {
    
        #region Constructor
        public DaoSqlServerAccesoPerfilRegla()
        {
        }
        #endregion 

        #region Conexion
        /// <summary>
        /// Llamar a la clase de conexion
        /// <returns>devuelve la conexion</returns>

        IDaoAccesoConexion bd = FabricaConexion.DaoSqlServerAccesoConexion();

        #endregion

        /// <summary>
        /// metodo que consulta los perfiles
        /// Almacenado en la Base de Datos
        /// </summary>
        /// <returns> devuelve true si se puede modificar el perfil</returns>
        public List<Entidad> ConsultarPerfiles()
        {
            List<Entidad> listaPerfiles = new List<Entidad>();
            
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosPerfilReglas]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    //PerfilRegla perfil = new PerfilRegla();
                    PerfilRegla perfil = new PerfilRegla();
                    perfil.IdPerfilRegla = reader.GetInt32(0);
                    perfil.NombrePerfilRegla = reader.GetString(1);
                    listaPerfiles.Add(perfil);
                }
                
                return listaPerfiles;
            }

            catch (SqlException)
            {
                Console.WriteLine("Error de SqlServer al consultar todos los perfiles de regla");
                return null;
            }

            catch (Exception)
            {
                Console.WriteLine("Error al consultar todos los perfiles de regla");
                return null;
            }
            finally
            {
                bd.CerrarConexionBd();
                
            }

        }

        /// <summary>
        /// Consulta las todas las reglas de Perfil
        /// </summary>
        /// <param name="nombre">Nombre de la Regla</param>
        /// <param name="tipo">Es el tipo de regla</param>
        /// <returns></returns>
        public Entidad ConsultarReglaPorPerfil(String nombre, String tipo)
        {
            SqlCommand command = new SqlCommand();

            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELConsultarPorPerfilRegla]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@nombrePerfilRegla", nombre);
                command.Parameters.AddWithValue("@tipoRegla", tipo);
                SqlDataReader reader = command.ExecuteReader();
                reader.Read();
                 
                //PerfilRegla perfil = new PerfilRegla();
                EntidadRegla perfil = new EntidadRegla();
                perfil.IdRegla = reader.GetInt32(0);
                perfil.NombreRegla = reader.GetString(1);
                //listaPerfiles.Add(perfil);
                   
               
                return perfil;
            }

            catch (SqlException)
            {
                Console.WriteLine("Error de SqlServer al consultar por perfil de regla");
                return null;
            }

            catch (Exception)
            {
                Console.WriteLine("Error al consultar por perfil de regla");
                return null;
            }
            finally
            {
                bd.CerrarConexionBd();

            }
        }

        /// <summary>
        /// Agregar Las Reglas pertenecientes a un perfil
        /// </summary>
        /// <param name="nombrePerfilRegla">Nombre del perfil a agregar</param>
        /// <param name="IdRegla">regla asociada a ese perfil</param>
        /// <returns></returns>
        public int AgregarPerfilRegla_Regla(String nombrePerfilRegla, int IdRegla)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;//Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[insertarPerfilReglaRegla]";//nombre del StoreProcedure
                command.CommandTimeout = 10;
                //insercion de regla
                command.Parameters.AddWithValue("@Nombre_Perfil_Regla", nombrePerfilRegla);
                command.Parameters.AddWithValue("@IdRegla", IdRegla);
                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return 1;

            }
            catch (SqlException)
            {
                Console.WriteLine("Error de SqlServer al insertar regla al perfil de regla");
                return -1;
            }

            catch (Exception)
            {
                Console.WriteLine("Error al insertar regla al perfil de regla");
                return -1;
            }
            finally
            {
                bd.CerrarConexionBd();

            }

        }

        /// <summary>
        /// Agregar perfil de regla
        /// </summary>
        /// <param name="perfil">Nombre del perfil</param>
        /// <param name="idUsuario">Usuario que lo creo</param>
        /// <returns></returns>
        public int AgregarPerfilRegla(String perfil, int idUsuario)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;//Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[insertarPerfilRegla]";//nombre del StoreProcedure
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@NombrePerfil", perfil);
                command.Parameters.AddWithValue("@idUsuario", idUsuario);//por los momentos le paso al usuario 1
                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();
                return 1;

            }
            catch (SqlException)
            {
                Console.WriteLine("Error de SqlServer al insertar perfil de regla");
                return -1;
            }

            catch (Exception)
            {
                Console.WriteLine("Error al insertar perfil de regla");
                return -1;
            }
            finally
            {
                bd.CerrarConexionBd();

            }

        }

        /// <summary>
        /// Buscar las reglas asociadas a un proyecto
        /// </summary>
        /// <param name="idProyecto">Proyecto a quien se le asocian las reglas</param>
        /// <returns></returns>
        public  PerfilRegla buscarReglas(int idProyecto)
        {
            SqlCommand command = new SqlCommand();
            PerfilRegla perfil = new PerfilRegla();
           
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[BuscaPerfilProyecto]"; // dado un perfil de reglas retorna las reglas que estan asociadas
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Proyecto", idProyecto);
                SqlDataReader reader = command.ExecuteReader();
                if (reader.HasRows)
                    while (reader.Read())
                    {
                        int idregla = reader.GetInt32(0);
                        string nombreregla = reader.GetString(1);
                        string tiporegla = reader.GetString(2);
                        string descripcion = reader.GetString(3);
                        Resultado result = new Resultado();
                        if (tiporegla == "Parentesis")
                        {
                            if (nombreregla == "ParentesisCEF")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ParentesisCEF");
                            }
                            else if (nombreregla == "ParentesisSE")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ParentesisSE");
                            }
                            else if (nombreregla == "ParentesisEX")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ParentesisEX");
                            }
                            else if (nombreregla == "ParentesisIN")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ParentesisIN");
                            }
                        }
                        else if (tiporegla == "Operadores")
                        {
                            if (nombreregla == "ConEspacio")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ConEspacio");
                            }
                            else if (nombreregla == "SinEspacio")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("SinEspacio");
                            }
                        }
                        else if (tiporegla == "NombreClase")
                        {
                            if (nombreregla == "Mayuscula_NoUnderscore")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("Mayuscula_NoUnderscore");
                            }
                            else if (nombreregla == "Mayuscula_SiUnderscore")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("Mayuscula_SiUnderscore");
                            }
                            else if (nombreregla == "Minuscula_NoUnderscore")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("Minuscula_NoUnderscore");
                            }
                            else if (nombreregla == "Minuscula_SiUnderscore")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("Minuscula_SiUnderscore");
                            }
                        }
                        else if (tiporegla == "Llaves")
                        {
                            if (nombreregla == "regla_LlavesSolas")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("regla_LlavesSolas");
                            }
                            else if (nombreregla == "regla_LlavesJuntas")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("regla_LlavesJuntas");
                            }
                            else if (nombreregla == "regla_LlavesCompJS")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("regla_LlavesCompJS");
                            }
                            else if (nombreregla == "regla_LlavesCompSJ")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("regla_LlavesCompSJ");
                            }
                        }
                        else if (tiporegla == "Documentacion")
                        {
                            if (nombreregla == "ComentarClase")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ComentarClase");
                            }
                            else if (nombreregla == "ComentarEstructura")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ComentarEstructura");
                            }
                            else if (nombreregla == "ComentarBoilerPlate")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ComentarBoilerPlate");
                            }
                            else if (nombreregla == "ComentarMetodo")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("ComentarMetodo");
                            }
                        }
                        else if (tiporegla == "NombreAtributo")
                        {
                            if (nombreregla == "AtributoMayuscula")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("AtributoMayuscula");
                            }
                            else if (nombreregla == "AtributoMinuscula")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("AtributoMinuscula");
                            }
                        }
                        else if (tiporegla == "NombreMetodo")
                        {
                            if (nombreregla == "MetodoM")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("MetodoM");
                            }
                            else if (nombreregla == "MetodoN")
                            {
                                perfil.idRegla.Add(idregla);
                                perfil.nombreRegla.Add("MetodoN");
                            }
                        }
                    }
                else
                    Console.WriteLine("No rows returned.");
                reader.Close();
                bd.CerrarConexionBd();
            }
            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
            return perfil;
        }

        /// <summary>
        /// Validar el nombre del perfil de la Regla a crear
        /// </summary>
        /// <param name="nombre">Nombre del perfil de Regla</param>
        /// <returns></returns>
        public bool ValidarNombreDePerfilRegla(String nombre)
        {
            SqlCommand command = new SqlCommand();

            try
            {
                bool resp = false;  
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELConsultarNombrePerfilRegla]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@nombrePerfilRegla", nombre);
                SqlDataReader reader = command.ExecuteReader();
                             
                if (reader.Read())
                {
                    PerfilRegla perfil = new PerfilRegla();
                    perfil.NombrePerfilRegla = reader.GetString(0);
                    resp = true;
                }

                return resp;
            }
            catch (SqlException)
            {
                Console.WriteLine("Error de SqlServer al consultar nombre perfil de regla");
                return false;
            }

            catch (Exception)
            {
                Console.WriteLine("Error al consultar nombre perfil de regla");
                return false;
            }
            finally
            {
                bd.CerrarConexionBd();

            }
        }

        /// <summary>
        /// procedimiento encargado de llamar al storeprocedure para limpiar el perfil
        /// </summary>
        /// <param name="nombrePerfil"></param>
        /// <returns></returns>
        public Boolean LimpiarPerfil(String nombrePerfil)
        {

            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;//Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[BusquedaLimpiarPerfil]";//nombre del StoreProcedure
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Perfil", nombrePerfil);

                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                bd.CerrarConexionBd();

                return true;
            }
            catch (Exception e)
            {
                return false;

            }


        }

        /// <summary>
        /// metodo que busca si el username que recibe es administrador o lider de proyecto y si dicho perfil no esta
        /// asignado a ningun proyecto para poderlo modificar
        /// </summary>
        /// <returns> devuelve true si se puede modificar el perfil</returns>
        public Boolean ValidaModificacion(String nombrePerfil, int username)
        {

            Boolean continuar = false;
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;//Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[PrivilegioUsuario]";//nombre del StoreProcedure
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Username", username);

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    continuar = true;
                }

                reader.Close();
                bd.CerrarConexionBd();
                if (continuar)
                {
                    SqlCommand command2 = new SqlCommand();
                    bd.AbrirConexionBd();
                    command2.Connection = bd.ObjetoConexion();
                    command2.CommandType = System.Data.CommandType.StoredProcedure;//Tipo de comando que se va a ejecutar
                    command2.CommandText = "[dbo].[PerfilAsociadoProyecto]";//nombre del StoreProcedure
                    command2.CommandTimeout = 10;
                    command2.Parameters.AddWithValue("@Perfil", nombrePerfil);

                    SqlDataReader reader2 = command2.ExecuteReader();

                    if (reader2.Read())
                    {
                        reader2.Close();
                        bd.CerrarConexionBd();
                        return false;
                    }

                    return true;
                }
                return false;

            }
            catch (Exception e)
            {
                return false;
            }
        }

    }
}
